package com.example.mysql.学习笔记.高级.数据库的优化之索引.InnoDB数据存储结构存储;

public class InnoDB行格式 {
}

/**
 * InnoDB行格式(或记录格式)
 *
 * COMPACT行格式
 * Dynamic（mysql默认）和Compressed行格式
 * Redundant 行格式
 *
 *
 *
 * 也可以使用如下语法查看具体表使用的行格式:
 * SHOW TABLE STATUS like 表名\G
 *
 * 指定表的行格式 在结尾添加
 * ROW_FORMAT=行格式名称
 *
 *
 */

/**
 * COMPACT行格式
 *
 * 记录的额外信息
 *    变长字段长度列表
 *       保存每个列的真实数据长度（倒叙保存（想从最后一列开始保存））
 *    NULL值列表 （0表示不为空  1表示为空）
 *       Compact行格式会把 "可以为 NULL" 的列统一管理起来，
 *       存在一个标记为NULL值列表中
 *       如果表中没有允许存储NULL的列，则NULL值列表也不存在了。
 *    记录头信息（5个字节）（40位）   详见 页的内部结构
 * 记录信息(表的每一个列)
 *     列1  值1
 *     列2  值2
 *     列3  值3 ....
 *
 *
 */

/**
 * Dynamic（mysql默认）和Compressed行格式
 *
 * 行溢出
 * varchar  变长字符  0-65535
 *   但是当创造时  有二个字节保存变长字符长度 0-65533
 *   NULL值的标识占一个字节65532(如果此字段声明not null 则不用此字节)
 * 通过上面的案例，我们可以知道一个页的大小一般是16KB，也就是16384字节，
 * 而一个 VARCHAR(M)类型的列就最多可以存储65533个字节，
 * 这样就可能出现一个页存放不了一条记录，这种现象称为""行溢出""
 *
 * 在Compact和 Redundant 行格式中，对于占用存储空间非常大的列，
 * 在记录的真实数据处只会存储该列的一部分数据，
 * 把剩余的数据分散存储在几个其他的页中进行分页存储，
 * 然后记录的真实数据处用20个字节存储指向这些页的地址
 * (当然这20个字节中还包括这些分散在其他页面中的数据的占用的字节数)，
 * 从而可以找到剩余数据所在的页。
 * 这称为页的扩展，
 * Compact和Redundant两种格式会在记录的真实数据处存储一部分数据
 * (存放768个前缀字节)，
 *
 *
 * Compressed和Dynamic两种记录格式
 * 对于存放在BLOB中的数据采用了完全的行湓出的方式。
 * 在数据页中只存放20个字节的指针(溢出页的地址) ,
 * 实际的数据都存放在Off Page (溢出页)中
 *
 * Compressed行记录格式的另一个功能就是，
 * 存储在其中的行数据会以zib的算法进行压缩，
 * 因此对于BLOB、TEXT、VARCHAR这类大长度类型的数据能够进行非常有效的存储
 *
 *
 *
 */

/**
 * Redundant 行格式
 * Redundant是MySQL 5. 0版本之前InnoDB的行记录存储方式，
 * MySQL 5.0支持 Redundant是为了兼容之前版本的页格式。
 * 记录的额外信息
 *     字段长度偏移量
 *         记录的是信息最后的位置
 *         记录的长度是此位置减去上一个的等于长度
 *         而COMPACT行格式记录的直接是长度、
 *         而且 Redundant 行格式定长字符串也记录
 *     记录头信息
 * 记录信息(表的每一个列)
 *     列1  值1
 *     列2  值2
 *     列3  值3 ....
 *
 *
 */